package com.cms.pub;

import org.springframework.ui.Model;

import com.efounder.builder.base.data.EFDataSet;
import com.efounder.builder.base.data.EFRowSet;
import com.persistence.qxgl.beans.SYSUser;

public class CMSFlowPermission {
	/**
	 * 判断提交状态
	 * @param model
	 * @param headRowSet
	 * @param itemDataSet
	 * @param flowRowSet
	 */
	public static void checkFormStatus(Model model, EFRowSet headRowSet, EFDataSet itemDataSet, EFRowSet nodeRowSet, EFRowSet flowRowSet, EFRowSet nextFlowRowSet, SYSUser user) {
		String             F_DJZT = headRowSet.getString("F_DJZT", "0");
		String             F_FLZT = "";
		String          NODE_TYPE = "";
		String            NODE_ID = "";
		String             F_BMBH = "";
		boolean             bFlzt = false;
		
		//开始节点不在这个功能里审批
		if(NODE_TYPE.equals("start") || nodeRowSet == null || flowRowSet == null || flowRowSet.getString("RESR_IN_CAUSE", "").equals("waiting")) {
			headRowSet.putString("FLOW_NODE_NAME", "提交任务");
			model.addAttribute("canEdit", "0");
			model.addAttribute("canSubmit", "0");
			model.addAttribute("canRetrieve", "0");
			model.addAttribute("canRollback", "0");
			return;
		}
		
		//获取节点任务
		if(nodeRowSet != null) {
			NODE_ID = nodeRowSet.getString("NODE_ID", "");
			NODE_TYPE = nodeRowSet.getString("NODE_TYPE", "");;
			headRowSet.putString("FLOW_NODE_NAME", nodeRowSet.getString("NODE_NAME", ""));
			/**
			 * 单据状态：
			 * 0：制单未提交，不用判断
			 * 1：制单提交，审核的时候能看到，应该判断一下
			 * 2：部分退回，应该判断一下
			 * 3：审批完成，则不用判断
			 */
			//审批完成，走完流程
			if(F_DJZT.equals("3") ) {
				model.addAttribute("canEdit", "0");
				model.addAttribute("canSubmit", "0");
				model.addAttribute("canRetrieve", "0");
				model.addAttribute("canRollback", "0");
				return;
			} 
			//未提交,除了开始节点，其他节点不能编辑
			else if(F_DJZT.equals("0")) {
				//除了开始节点，余节点看不到
				model.addAttribute("canEdit", "0");
				model.addAttribute("canSubmit", "0");
				model.addAttribute("canRetrieve", "0");
				model.addAttribute("canRollback", "0");
			} 
			//单据已经提交,除了开始节点，其他节点在这判断
			if(F_DJZT.equals("1")) {
				//部门编辑节点，则需要判断是否可编辑按钮
				
				//循环分录取出部门
				for(int i = 0; i < itemDataSet.getRowCount(); i++) {
					F_BMBH = itemDataSet.getRowSet(i).getString("F_BMBH", "");
					F_FLZT = itemDataSet.getRowSet(i).getString("F_FLZT", "");
					//如果部门相同，则判断编辑按钮权限
					if(F_BMBH.equals(flowRowSet.getString("TASK_TO_UNIT", ""))) {
						itemDataSet.getRowSet(i).putString("OP_TYPE", "1");
					} else {
						itemDataSet.getRowSet(i).putString("OP_TYPE", "0");
					}
				}
				if(NODE_ID.equals("N2")) {
					//循环分录取出部门
					for(int i = 0; i < itemDataSet.getRowCount(); i++) {
						F_BMBH = itemDataSet.getRowSet(i).getString("F_BMBH", "");
						F_FLZT = itemDataSet.getRowSet(i).getString("F_FLZT", "");
						//如果部门相同，则判断编辑按钮权限
						if(F_BMBH.equals(flowRowSet.getString("TASK_TO_UNIT", ""))) {
							//如果分录状态未提交，则可以编辑和退回，并提交
							if(F_FLZT.equals("0")){
								if(flowRowSet.getString("RESR_STATUS", "processed").endsWith("processed")) {
									model.addAttribute("canEdit", "0");
									model.addAttribute("canSubmit", "0");
									model.addAttribute("canRetrieve", "0");
									model.addAttribute("canRollback", "0");
								} else {
									model.addAttribute("canEdit", "1");
									model.addAttribute("canSubmit", "1");
									model.addAttribute("canRetrieve", "0");
									model.addAttribute("canRollback", "1");
								}								
							} 
							//如果分录状态已经提交，单据状态等于1说明流程可能等待其他部门审批，或者等待分管经理审批
							else {
								//如果流程状态为pending，则说明有可能退回的
								if(flowRowSet.getString("RESR_STATUS", "").equals("pending")) {
									model.addAttribute("canEdit", "1");
									model.addAttribute("canSubmit", "1");
									model.addAttribute("canRetrieve", "0");
									model.addAttribute("canRollback", "1");
								}
								//部门审批节点，并且下一个节点的状态为processed，说明已经进入到下一个节点，则不允许取回
								else if(flowRowSet.getString("RESR_STATUS", "").equals("processed") && flowRowSet.getString("RESR_OUT_CAUSE", "").equals("waiting") &&
									nextFlowRowSet.getString("RESR_STATUS", "").equals("processed")) {
									model.addAttribute("canRetrieve", "0");
									model.addAttribute("canEdit", "0");
									model.addAttribute("canSubmit", "0");
									model.addAttribute("canRollback", "0");
								} else {
									model.addAttribute("canEdit", "0");
									model.addAttribute("canSubmit", "0");
									model.addAttribute("canRollback", "0");
									model.addAttribute("canRetrieve", "1");
								}
							}
						}
					}
				}
				//分管领导节点，可以分对某几个部门退回,只有所有的部门都审批后，分管经理才可以看到任务节点，所以所有部门初始退回按钮都可编辑
				else if(NODE_ID.equals("N3")) {
					if(flowRowSet.getString("RESR_STATUS", "pending").equals("pending")) {
						//循环分录取出部门
						for(int i = 0; i < itemDataSet.getRowCount(); i++) {							
							//编辑按钮权限
							itemDataSet.getRowSet(i).putString("OP_TYPE", "1");
						}
						model.addAttribute("canEdit", "0");
						model.addAttribute("canSubmit", "1");
						model.addAttribute("canRetrieve", "0");
						model.addAttribute("canRollback", "1");
						return;
					} else {
						model.addAttribute("canEdit", "0");
						model.addAttribute("canSubmit", "0");
						model.addAttribute("canRetrieve", "0");
						model.addAttribute("canRollback", "0");
					}
				}
				//部门确认
				else if(NODE_ID.equals("N4")) {
					if(flowRowSet.getString("RESR_STATUS", "").equals("processed")) {
						model.addAttribute("canEdit", "0");
						model.addAttribute("canSubmit", "0");
						model.addAttribute("canRetrieve", "0");
						model.addAttribute("canRollback", "0");
					} else {
						//循环分录取出部门
						for(int i = 0; i < itemDataSet.getRowCount(); i++) {
							F_BMBH = itemDataSet.getRowSet(i).getString("F_BMBH", "");
							//如果部门相同，则判断编辑按钮权限
							if(F_BMBH.equals(flowRowSet.getString("TASK_TO_UNIT", ""))) {
								if(!itemDataSet.getRowSet(i).getString("XG_JZRQ", "").equals("")) {
									model.addAttribute("canRetrieve", "0");
								} else {
									model.addAttribute("canRetrieve", "1");
								}
							}
						}
						
						model.addAttribute("canEdit", "1");
						model.addAttribute("canSubmit", "1");
						
						model.addAttribute("canRollback", "0");
					}
					
				}
				//如果是结束节点，则不允许编辑
				else if(NODE_TYPE.equals("end")) {
					//循环分录取出部门
					for(int i = 0; i < itemDataSet.getRowCount(); i++) {
						F_FLZT = itemDataSet.getRowSet(i).getString("F_FLZT", "");
						//判断分录状态
						if(F_FLZT.equals("1")) {
							bFlzt = true;
							break;
						}
					}
					//如果分录都已经提交，则最后节点就可以审批
					if(bFlzt) {
						model.addAttribute("canEdit", "0");
						model.addAttribute("canSubmit", "1");
						model.addAttribute("canRetrieve", "0");
						model.addAttribute("canRollback", "1");
						return;
					} 
					//没有提交的分录，则可以
					else {
						model.addAttribute("canEdit", "0");
						model.addAttribute("canSubmit", "1");
						model.addAttribute("canRetrieve", "0");
						model.addAttribute("canRollback", "1");
					}
					return;
				} 
			}
			//退回
			else if(F_DJZT.equals("2")) {
				//循环分录取出部门
				for(int i = 0; i < itemDataSet.getRowCount(); i++) {
					F_BMBH = itemDataSet.getRowSet(i).getString("F_BMBH", "");
					F_FLZT = itemDataSet.getRowSet(i).getString("F_FLZT", "");
					//如果部门相同，则判断编辑按钮权限
					if(F_BMBH.equals(flowRowSet.getString("TASK_TO_UNIT", ""))) {
						itemDataSet.getRowSet(i).putString("OP_TYPE", "1");
					} else {
						itemDataSet.getRowSet(i).putString("OP_TYPE", "0");
					}
					if(F_FLZT.equals("0") && !bFlzt) {
						bFlzt = true;
					}
				}
				if(flowRowSet.getString("RESR_STATUS", "processed").equals("processed") && !flowRowSet.getString("RESR_IN_CAUSE", "").equals("") && !flowRowSet.getString("RESR_OUT_CAUSE", "").equals("")) {
					model.addAttribute("canEdit", "0");
					model.addAttribute("canSubmit", "0");					
					model.addAttribute("canRollback", "0");
					model.addAttribute("canRetrieve", "0");
//					if(bFlzt) model.addAttribute("canRetrieve", "1");
//					else model.addAttribute("canRetrieve", "0");
				} else if(flowRowSet.getString("RESR_STATUS", "processed").equals("processed") && flowRowSet.getString("NODE_TAG", "").equals("N2") && flowRowSet.getString("NODE_SRC", "").equals("N1")) {
					model.addAttribute("canEdit", "0");
					model.addAttribute("canSubmit", "0");
					model.addAttribute("canRetrieve", "0");
					model.addAttribute("canRollback", "0");
				}else {
					model.addAttribute("canEdit", "1");
					model.addAttribute("canSubmit", "1");
					model.addAttribute("canRetrieve", "0");
					model.addAttribute("canRollback", "1");
				}				
			} else {
				model.addAttribute("canSubmit", "0");
				model.addAttribute("canRetrieve", "1");
			}
		}
		
//		if(flowRowSet.getString("RESR_STATUS", "processed").endsWith("processed")) {
//			model.addAttribute("canEdit", "0");
//			model.addAttribute("canSubmit", "0");
//			model.addAttribute("canRetrieve", "0");
//			model.addAttribute("canRollback", "0");
//		}
	}
}
